package pe.gob.osce.sirenas.wd.jsf.bean.registro;
/*
* Resumen.
* Objeto 				:	RegistroSolicitudBean.java
* Descripcion 			: 	.
* Fecha de Creacion 	: 	26/02/2015.
* Pry de Creacion 		: 	RNA/RNS.
* Autor 				: 	Julio Cayulla.
* ================================================================================================
* Modificaciones
* Motivo						Fecha		Nombre				Descripcion
* ================================================================================================
*
*/
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;

import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.ParametrosDTO;
import pe.gob.osce.sirenas.model.SolicitudInscripcionDTO;
import pe.gob.osce.sirenas.svc.ObtenerDatosComunesServiceLocal;
import pe.gob.osce.sirenas.svc.SolicitarInscripcionServiceLocal;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;
import pe.gob.osce.sirenas.util.NegocioException;
import pe.gob.osce.sirenas.wd.util.CaptchaVO;
import pe.gob.osce.sirenas.wd.util.ConstanteWeb;
import pe.gob.osce.sirenas.wd.util.ImagenVo;
import pe.gob.osce.sirenas.wd.util.RepositorioDatos;
import pe.gob.osce.sirenas.wd.util.UBaseManage;
import pe.gob.osce.sirenas.wd.util.ValidacionUtil;

@ManagedBean
@SessionScoped
public class RegistroSolicitudBean extends UBaseManage implements Serializable{
	final static Logger log = Logger.getLogger(RegistroSolicitudBean.class);
	/**
	 * 
	 */
	private static final long serialVersionUID = -6504218398693580763L;
	

	@EJB
	private	SolicitarInscripcionServiceLocal	solicitarInscripcionService;	
	@EJB
	private	ObtenerDatosComunesServiceLocal	obtenerDatosComunesService;
	
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteWeb.PROPERTIES);

    private RequestContext context; 
	private	SolicitudInscripcionDTO		registro;
	private AuditoriaDTO auditoria;
	private RepositorioDatos repositorioDatos;
	private Boolean aceptoCondiciones=null;
	private Boolean verMensaje=false;

	private Boolean permisoRegistro=false;
	private Boolean existeSolicitud=false;
	private Boolean existePersona=false;

	private Integer maxDocumento=8;


	public void cambioTipoDocumento(ValueChangeEvent event)throws Exception{
		String idTipoDoc=event.getNewValue().toString().trim();
		
		if(idTipoDoc.equals("")){
			this.maxDocumento=0;
			setMensajeroInfo("Debe Seleccionar el Tipo de Documento");
		}
		if(idTipoDoc.equals("121")){
			this.maxDocumento=8;
			this.permisoRegistro=false;
			this.registro.setNumDocumento("");
		}
		if(idTipoDoc.equals("122")){
			this.maxDocumento=12;
			this.permisoRegistro=false;
			this.registro.setNumDocumento("");
		}
	}
		
	@PostConstruct
    public void init() {

		this.registro=new SolicitudInscripcionDTO();
		this.repositorioDatos = obtenerRepositorioDatos();
		this.aceptoCondiciones=false;
		this.verMensaje=false;
		this.aceptoCondiciones=null;
		this.permisoRegistro=false;
		this.existeSolicitud=false;
		this.existePersona=false;
		
    }
	public void reset(){
		this.registro=new SolicitudInscripcionDTO();
		this.repositorioDatos = obtenerRepositorioDatos();
		this.aceptoCondiciones=false;
		this.verMensaje=false;
		this.aceptoCondiciones=null;
		this.permisoRegistro=false;
		this.existeSolicitud=false;
		this.existePersona=false;
        RequestContext.getCurrentInstance().reset("idFormConsola:basic");
	}
	/**
	 * Resumen.	Metodo que iniciliza la bandeja de evaluacion de quejas
	 * @return cadena mapeada para la navegacion, tipo String.
	 */
	public String verRegistroSolicitud() {
		this.registro=new SolicitudInscripcionDTO();
		this.repositorioDatos = obtenerRepositorioDatos();
		this.aceptoCondiciones=false;
		this.verMensaje=false;
		
		this.auditoria.setUsuarioRegistro("PUBLICO");
		this.auditoria.setFecRegistro(new Date()); 
		establecerObjetoSession(ConstanteWeb.AUDITORIA, this.auditoria);
		return "verRegistroSolicitud";
	}
	
	public boolean validaSolicitud(){
		boolean validacion=true;
		if(!this.aceptoCondiciones){
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_REQUIRED),propSirenas.getString(ConstanteWeb.MSJ_REQ_CONDICIONES));
			return false;
		}if(this.registro.getIdRegion()<=0){
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_REQUIRED),propSirenas.getString(ConstanteWeb.MSJ_REQ_REGION));
			return false;
		}if(this.registro.getIdProvincia()<=0){
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_REQUIRED),propSirenas.getString(ConstanteWeb.MSJ_REQ_PROVINCIA));
			return false;
		}if(this.registro.getIdDistrito()<=0){
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_REQUIRED),propSirenas.getString(ConstanteWeb.MSJ_REQ_DISTRITO));
			return false;
		}
		
		return validacion;
	}
	
	public String  registrarSolicitud( ){
		String pagConfirmacion=null;
		this.verMensaje=false;
		
		if(validaSolicitud()){	
			SolicitudInscripcionDTO		solicitudInscripcionDTO;
			this.auditoria=(AuditoriaDTO)obtenerObjetoSession(ConstanteWeb.AUDITORIA);
			Long correlativo=repositorioDatos.getCorrelativos().get(propSirenas.getString(ConstanteWeb.KEY_CORRELATIVO_SOLICITUD));
			Calendar ahoraCal = Calendar.getInstance();
			int anio=ahoraCal.get(Calendar.YEAR);
			try{            
				/* Conversion de datos de interfaz */
				solicitudInscripcionDTO= this.registro.clone();
				solicitudInscripcionDTO.setNumeroSolicitud(anio+"-"+String.format("%0"+propSirenas.getString(ConstanteWeb.LENGTH_CORRELATIVO)+"d", correlativo));	
				solicitudInscripcionDTO.setFechaVencimiento(calculaFechaVencimiento().getTime());
				
				solicitarInscripcionService.guardarSolicitudInscripcion(solicitudInscripcionDTO,auditoria);

				/**Si todo sale Bien Actualizo el Correlativo*/
				ParametrosDTO parametro=new ParametrosDTO();
				parametro.setIdParametro(repositorioDatos.getValueParametro(propSirenas.getString(ConstanteWeb.KEY_CORRELATIVO_SOLICITUD)) );
				parametro.setDescValor2(correlativo+1);
				obtenerDatosComunesService.actualizarCorrelativo(parametro, auditoria);

				JasperPrint jasperSolicitud = new JasperPrint();
				jasperSolicitud=generaSolicitudPdf(solicitudInscripcionDTO,jasperSolicitud);
				String rutaArchivo=guardoReporteServidor(propSirenas.getString(ConstanteWeb.FS_FICHAS),solicitudInscripcionDTO.getNumeroSolicitud(),jasperSolicitud);

				solicitarInscripcionService.notificarViaCorreoElectronico(solicitudInscripcionDTO.getCorreoElectronico(), rutaArchivo);

				init();
				log.info("Registrado Correctamente");
				pagConfirmacion="verConfirmacionSolicitud";
			} catch (ModeloException e) {
				setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
			}catch (NegocioException e) {
				setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
			}catch (Exception e) {
				e.printStackTrace();
				if(e.getMessage()!=null)
					setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),e.getMessage());
				else
					setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_SOLICITUD));					
			}
			this.verMensaje=true;
		}else{
			this.verMensaje=true;
		}
		return pagConfirmacion;
	}

	public Calendar calculaFechaVencimiento(){
		int plazoSolicitud=repositorioDatos.getPlazoSolicitud();
		Calendar fechaInicial = new GregorianCalendar();
    
		while (plazoSolicitud>0) {
			if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
				plazoSolicitud-=1;
			}
			fechaInicial.add(Calendar.DATE, 1);
		}
		return fechaInicial;
	}
		  
	public JasperPrint generaSolicitudPdf(SolicitudInscripcionDTO solicitudInscripcionDTO,JasperPrint jasperSolicitud)throws NegocioException {

		HashMap parametros = new HashMap();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/M/yyyy");
		try {
			InputStream reportLstExpLecturaProgramadaSt = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/reporte/jasper/rptSolicitudInscripcion.jasper");

			String rutaImagenLogo = "/recursos/imagenes/Sello Oficial.jpg";
			InputStream imgLogoSt = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(rutaImagenLogo);
			parametros.put("P_IMAGEN_LOGO", imgLogoSt);
			
			parametros.put("numRuc", ""+solicitudInscripcionDTO.getNumRuc());
			parametros.put("numeroSolicitud", ""+solicitudInscripcionDTO.getNumeroSolicitud());
			parametros.put("apePaterno", ""+solicitudInscripcionDTO.getApePaterno());
			parametros.put("apeMaterno", ""+solicitudInscripcionDTO.getApeMaterno());
			parametros.put("nombres", ""+solicitudInscripcionDTO.getNombres());
			parametros.put("fecNacimiento", ""+sdf.format(solicitudInscripcionDTO.getFecNacimiento()));
			parametros.put("tipoDocumento", ""+ repositorioDatos.getLabelDocumentoID(solicitudInscripcionDTO.getIndTipoDocumento().longValue()));
			parametros.put("numDocumento", ""+solicitudInscripcionDTO.getNumDocumento());
			parametros.put("correoElectronico01", ""+solicitudInscripcionDTO.getCorreoElectronico());
			parametros.put("telefono01", ""+solicitudInscripcionDTO.getTelefono());
			parametros.put("direccion", ""+solicitudInscripcionDTO.getDireccion());
			parametros.put("referencias", ""+solicitudInscripcionDTO.getReferencias());
			parametros.put("urbanizacion", ""+solicitudInscripcionDTO.getUrbanizacion());
			parametros.put("fecRegistro", ""+sdf.format(new Date()));
			parametros.put("fecVencimiento", ""+sdf.format(solicitudInscripcionDTO.getFechaVencimiento()));
			parametros.put("cantDias", ""+repositorioDatos.getPlazoSolicitud());

			parametros.put("region",repositorioDatos.getLabelRegion(solicitudInscripcionDTO.getIdRegion()).toUpperCase() );
			parametros.put("provincia", repositorioDatos.getLabelProvincia(solicitudInscripcionDTO.getIdProvincia()).toUpperCase());
			parametros.put("distrito", repositorioDatos.getLabelDistrito(solicitudInscripcionDTO.getIdDistrito()).toUpperCase());
			

			parametros.put("genero", ""+repositorioDatos.getLabelParametro(solicitudInscripcionDTO.getGenero() ));
			parametros.put("tipo_zona", ""+repositorioDatos.getLabelTipoZona(solicitudInscripcionDTO.getIdTipoZona()));
			parametros.put("tipo_via", ""+repositorioDatos.getLabelTipoVia(solicitudInscripcionDTO.getIdTipoVia() ));
			
			jasperSolicitud = JasperFillManager.fillReport(reportLstExpLecturaProgramadaSt,parametros);

		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			throw new NegocioException(e.getMessage(),e);
		}
		return jasperSolicitud;
		
	}

	public void validaPermisoRegistro(){
		//String numRUC=this.registro.getNumRuc().replace("_", "");
		if(this.registro.getNumRuc()!=null && this.registro.getNumDocumento()!=null)
			if(this.registro.getNumRuc().trim().length()==11 && this.registro.getNumDocumento().trim().length()==this.maxDocumento){
				try{
					this.existeSolicitud=solicitarInscripcionService.validaExisteRegistroSolicitudVigente(this.registro);
					this.existePersona=solicitarInscripcionService.validaExisteRegistroPersona(this.registro);
					
					if(!this.existeSolicitud && !this.existePersona){
						this.permisoRegistro=true;
					}else{
						this.permisoRegistro=false;
						abrirMensajePermisoRegistro();
					}
				} catch (ModeloException e) {
					setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
				}
				catch (Exception e) {
					setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),propSirenas.getString(ConstanteWeb.EXC_VISTA_SOLICITUD));
				}
			}else{
				if(this.registro.getNumRuc().trim().length()!=11){
					setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),"Debe Ingresar el Número de R.U.C.");
				}
				if(this.registro.getNumDocumento().trim().length()!=this.maxDocumento){
					setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),"Debe Ingresar el Número de Documento");
				}
				this.permisoRegistro=false;
			}
	}

	
	

	
	
	public void requiereDescZona(ValueChangeEvent event ){
		if(event.getNewValue()!=null){

			this.registro.setRequiereZona(true);
		}else{

			this.registro.setRequiereZona(false);
		}
	}
	
	
	public void abrirMensajePermisoRegistro(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('permisoRegistroPopup').show();");
	}
	/**
	 * Metodo que permite obtener registro.
	 * @return registro , tipo SolicitudInscripcionDTO.
	 */
	public SolicitudInscripcionDTO getRegistro() {
		return registro;
	}


	/**
	 * Permite actualizar registro.
	 * @param registro, tipo SolicitudInscripcionDTO.
	 */
	public void setRegistro(SolicitudInscripcionDTO registro) {
		this.registro = registro;
	}
	/**
	 * Metodo que permite obtener aceptoCondiciones.
	 * @return aceptoCondiciones , tipo Boolean.
	 */
	public Boolean getAceptoCondiciones() {
		return aceptoCondiciones;
	}
	/**
	 * Permite actualizar aceptoCondiciones.
	 * @param aceptoCondiciones, tipo Boolean.
	 */
	public void setAceptoCondiciones(Boolean aceptoCondiciones) {
		this.aceptoCondiciones = aceptoCondiciones;
	}
	/**
	 * Metodo que permite obtener verMensaje.
	 * @return verMensaje , tipo Boolean.
	 */
	public Boolean getVerMensaje() {
		return verMensaje;
	}
	/**
	 * Permite actualizar verMensaje.
	 * @param verMensaje, tipo Boolean.
	 */
	public void setVerMensaje(Boolean verMensaje) {
		this.verMensaje = verMensaje;
	}
	/**
	 * Metodo que permite obtener permisoRegistro.
	 * @return permisoRegistro , tipo Boolean.
	 */
	public Boolean getPermisoRegistro() {
		return permisoRegistro;
	}
	/**
	 * Permite actualizar permisoRegistro.
	 * @param permisoRegistro, tipo Boolean.
	 */
	public void setPermisoRegistro(Boolean permisoRegistro) {
		this.permisoRegistro = permisoRegistro;
	}
	/**
	 * Metodo que permite obtener existeSolicitud.
	 * @return existeSolicitud , tipo Boolean.
	 */
	public Boolean getExisteSolicitud() {
		return existeSolicitud;
	}
	/**
	 * Permite actualizar existeSolicitud.
	 * @param existeSolicitud, tipo Boolean.
	 */
	public void setExisteSolicitud(Boolean existeSolicitud) {
		this.existeSolicitud = existeSolicitud;
	}
	/**
	 * Metodo que permite obtener existePersona.
	 * @return existePersona , tipo Boolean.
	 */
	public Boolean getExistePersona() {
		return existePersona;
	}
	/**
	 * Permite actualizar existePersona.
	 * @param existePersona, tipo Boolean.
	 */
	public void setExistePersona(Boolean existePersona) {
		this.existePersona = existePersona;
	}

	public Integer getMaxDocumento() {
		return maxDocumento;
	}

	public void setMaxDocumento(Integer maxDocumento) {
		this.maxDocumento = maxDocumento;
	}


}
